package com.cj.user.service.zingfront;

import java.util.Scanner;

/**
 * @Author cheng jun
 * @Description:
 */
public class PenQuestions2 {

    /**
     * ⻢路上有⼀块⿊⽩斑⻢线，A代表⿊，B代表⽩，不过因为施⼯⼈员不⼩⼼，导致⽬
     * 前斑⻢线很奇怪，例如AAB，这个时候⼩⽩突发奇想，如果将AAB进⾏0次或者多
     * 次以下操作
     * 把斑⻢线从某个地⽅切开，然后得到的两块进⾏翻转，在拼接在⼀起（AAB ->
     * A , AB 旋转拼接后ABA，得到最⻓连续⿊⽩相间的⻓度为3）
     * 求问，如果斑⻢线ABABAAABAB，他的最⻓连续⿊⽩相间⻓度为多少
     */

    /**
     *基本算法描述及分析要点：
     * 1.calculatedTheMaximumDength方法是先遍历入参，如果入参满足ABA连续相间就把临时存储的长度加1，否则临时存储长度与最长长度比
     * 较，比它大就赋值给它并初始化临时存储长度，等入参遍历完就可以算出最长连续黑白相间长度;
     * 2.cutZebraCrossing方法是先用一个变量存储入参的最长连续黑白相间长度，然后进行遍历，也就是切割次数，然后随机在一个位置切，切
     * 割后翻转拼接，拼接后用calculatedTheMaximumDength方法算出最长连续黑白相间长度，然后与之前记录最大连续相间长度相比较，比它大
     * 就赋值给它；
     * 3.重复数次2的过程即可算出入参的最⻓连续⿊⽩相间⻓度;
     */

    public static int calculatedTheMaximumDength(String str) {
        //临时存储连续黑白相间长度
        int lengthMax = 1;
        //存储最长连续黑白相间长度
        int lengthMax2 = 1;
        String[] strArray = str.split("");
        int arrayLength = strArray.length;
        for (int i = 0; i < arrayLength; i++) {
            //如果满足ABA原则就加1
            if ((i + 1) < arrayLength && (("A".equals(strArray[i]) && "B".equals(strArray[i + 1])) || ("B".equals(
                    strArray[i]) && "A".equals(strArray[i + 1])))) {
                lengthMax++;
            } else {
                //否则临时存储长度与最长长度比较，比它大就赋值给它并初始化临时存储长度
                if (lengthMax > lengthMax2) {
                    lengthMax2 = lengthMax;
                }
                //不连续了就赋初值
                lengthMax = 1;
            }
        }
        return lengthMax2;
    }

    public static int cutZebraCrossing(String str) {
        //临时存储最大连续相间长度
        int lengthMax = 1;
        //记录最大连续相间长度
        int lengthMax2 = calculatedTheMaximumDength(str);
        //记录上一次切割翻转合并后的斑马线
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(str);
        //多次切（100次）
        for (int i = 0; i < 100; i++) {
            //随机一个位置切开
            int incision = 1 + (int) (Math.random() * (str.length() - 1));
            //切开后未翻转的斑马线1
            String[] strArray1 = stringBuilder.substring(0, incision).split("");
            //切开后未翻转的斑马线2
            String[] strArray2 = stringBuilder.substring(incision).split("");
            //切开并翻转后的斑马线1
            StringBuilder stringBuilder1 = new StringBuilder();
            //切开并翻转后的斑马线2
            StringBuilder stringBuilder2 = new StringBuilder();
            int arrayLength1 = strArray1.length;
            int arrayLength2 = strArray2.length;
            //倒序遍历
            for (int i1 = arrayLength1 - 1; i1 >= 0; i1--) {
                stringBuilder1.append(strArray1[i1]);
            }
            for (int i1 = arrayLength2 - 1; i1 >= 0; i1--) {
                stringBuilder2.append(strArray2[i1]);
            }
            //拼接后面一段斑马线
            stringBuilder1.append(stringBuilder2);

            //计算最大连续相间长度
            lengthMax = calculatedTheMaximumDength(stringBuilder1.toString());
            if (lengthMax > lengthMax2) {
                lengthMax2 = lengthMax;
            }

            //记录上一次切割翻转合并后的斑马线
            stringBuilder.delete(0, stringBuilder.length());
            stringBuilder.append(stringBuilder1);
        }
        return lengthMax2;
    }

    public static void main(String[] args) {
        System.out.println("请给出一条斑马线:");
        Scanner scanner = new Scanner(System.in);
        System.out.println("该斑马线的最⻓连续⿊⽩相间⻓度为:" + cutZebraCrossing(scanner.nextLine()));
    }
}
